package main

import (
	"bytes"
	"encoding/gob"
	"log"
	"time"
)

// Block 定义区块结构
type Block struct {
	Time     int64  // 时间戳
	Data     []byte // 区块数据
	PrevHash []byte // 前一个区块的哈希
	Hash     []byte // 当前区块的哈希
	Nonce    int    // 工作量证明的计数器
}

// NewBlock 创建新区块
func NewBlock(data string, prevHash []byte) *Block {
	block := &Block{
		Time:     time.Now().Unix(),
		Data:     []byte(data),
		PrevHash: prevHash,
		Hash:     []byte{},
		Nonce:    0,
	}
	// 使用工作量证明算法计算哈希
	pow := NewProofOfWork(block)
	nonce, hash := pow.Run()
	block.Hash = hash[:]
	block.Nonce = nonce
	return block
}

// Serialize 将区块序列化为字节数组
func (b *Block) Serialize() []byte {
	var result bytes.Buffer
	encoder := gob.NewEncoder(&result)

	err := encoder.Encode(b)
	if err != nil {
		log.Panic(err) // 处理错误
	}
	return result.Bytes()
}

// DeserializeBlock 将字节数组反序列化为区块
func DeserializeBlock(d []byte) *Block {
	var block Block

	decoder := gob.NewDecoder(bytes.NewReader(d))
	err := decoder.Decode(&block)
	if err != nil {
		log.Panic(err) // 错误处理
	}
	return &block
}
